package com.school.sports.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Min;
import javax.validation.constraints.Max;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 排名表实体类
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("rank")
public class Rank {
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 项目ID
     */
    @NotNull(message = "项目ID不能为空")
    private Long projectId;

    /**
     * 轮次
     */
    @Min(value = 1, message = "轮次至少为1")
    @Max(value = 10, message = "轮次不能超过10")
    private Integer round;

    /**
     * 用户ID
     */
    @NotNull(message = "用户ID不能为空")
    private Long userId;

    /**
     * 名次
     */
    @NotNull(message = "名次不能为空")
    @Min(value = 1, message = "名次至少为1")
    private Integer rank;

    /**
     * 成绩数值
     */
    private BigDecimal scoreValue;

    /**
     * 创建时间
     */
    private LocalDateTime createdAt;

    /**
     * 用户对象（关联查询时使用）
     */
    @TableField(exist = false)
    private User user;

    /**
     * 项目对象（关联查询时使用）
     */
    @TableField(exist = false)
    private Project project;

    /**
     * 成绩对象（关联查询时使用）
     */
    @TableField(exist = false)
    private Score score;

    // 以下字段为了兼容旧代码保留，建议使用关联对象
    /**
     * 项目名称（关联自project表）
     */
    @TableField(exist = false)
    private String projectName;

    /**
     * 项目类型（如跑步、跳远等，关联自project表）
     */
    @TableField(exist = false)
    private String projectType;

    /**
     * 用户名（关联自user表）
     */
    @TableField(exist = false)
    private String userName;

    /**
     * 用户真实姓名（关联自user表）
     */
    @TableField(exist = false)
    private String userRealName;

    /**
     * 用户性别（关联自user表）
     */
    @TableField(exist = false)
    private String userGender;

    /**
     * 用户班级（关联自user表）
     */
    @TableField(exist = false)
    private String userClass;

    /**
     * 成绩单位（关联自score表）
     */
    @TableField(exist = false)
    private String scoreUnit;

    /**
     * 获取格式化的成绩值
     */
    public String getFormattedScore() {
        if (scoreValue == null) {
            return "-";
        }
        return scoreValue.stripTrailingZeros().toPlainString() + (scoreUnit != null ? scoreUnit : "");
    }

    /**
     * 获取奖牌类型
     */
    public String getMedalType() {
        if (rank == null) return "";

        if (rank == 1) return "金牌";
        if (rank == 2) return "银牌";
        if (rank == 3) return "铜牌";

        return "";
    }

    /**
     * 是否获得奖牌
     */
    public boolean hasMedal() {
        return rank != null && rank >= 1 && rank <= 3;
    }

    /**
     * 是否为冠军
     */
    public boolean isChampion() {
        return Integer.valueOf(1).equals(rank);
    }

    /**
     * 检查排名是否有效
     */
    public boolean isValidRank() {
        return rank != null && rank > 0;
    }

    /**
     * 获取排名显示文本
     */
    public String getRankDisplay() {
        if (rank == null) return "-";

        switch (rank) {
            case 1:
                return "第一名 🥇";
            case 2:
                return "第二名 🥈";
            case 3:
                return "第三名 🥉";
            default:
                return "第" + rank + "名";
        }
    }

    /**
     * 从关联对象同步字段信息
     */
    public void syncFieldsFromObjects() {
        if (user != null) {
            this.userName = user.getUsername();
            this.userRealName = user.getRealName();
            this.userGender = user.getGender();
            this.userClass = user.getClassName();
        }

        if (project != null) {
            this.projectName = project.getName();
            this.projectType = project.getType();
        }

        if (score != null) {
            this.scoreUnit = score.getScoreUnit();
        }
    }
}